/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

/**
 *
 * @author Antonio
 */
@Entity
@NamedQueries({
    @NamedQuery(name = "prodotto.cercaPerNome", query = "SELECT p FROM Reparto p WHERE p.nome=?1"),
    @NamedQuery(name = "prodotto.cercaPerId", query = "SELECT p FROM Reparto p WHERE p.id=?1"),
    @NamedQuery(name = "prodotto.cercaDaMarchio", query = "SELECT p FROM Prodotto p, Marchio m WHERE m.id=?1 AND p.marchio=m"),
    @NamedQuery(name = "prodotto.prezzo", query = "SELECT dp FROM DettaglioPrezzo dp WHERE dp.prodotto.codiceBarre=?1 AND dp.negozio.id=?2"),
    @NamedQuery(name = "prodotto.prodottoFornito", query = "SELECT p FROM Fornitura f, Prodotto p, Negozio n WHERE f.prodotto=p AND p.codiceBarre=?1 AND n.id=?2 AND f.negozio=n"),
    @NamedQuery(name = "prodotto.prodottiDaUnSet", query = "SELECT p FROM Prodotto p WHERE p.codiceBarre IN :lista")
})
@NamedNativeQueries({
    @NamedNativeQuery(name = "prodotto.prodottoDaRepartoFornituraMaggioreZero", query = "SELECT p . * FROM PRODOTTO p, REPARTO r WHERE r.id = p.reparto_id AND r.id=?1 "
    + "AND EXISTS( SELECT n.id FROM NEGOZIO n WHERE id = ?2 AND (p.codicebarre , n.id) "
    + "IN (SELECT f.prodotto, f.negozio FROM FORNITURA f WHERE f.quantita > 0))", resultClass = Prodotto.class)
})
public class Prodotto implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    private Long codiceBarre;
    @Column(unique = true)
    private String nome;
    private String descrizione;
    @ManyToOne
    private Reparto reparto;
    @ManyToOne
    private Marchio marchio;
    @ManyToOne
    private Foto foto;
    @OneToMany(mappedBy = "prodotto")
    private List<DettaglioPrezzo> dettaglioPrezzo;

    public Long getCodiceBarre() {
        return codiceBarre;
    }

    public void setCodiceBarre(Long codiceBarre) {
        this.codiceBarre = codiceBarre;
    }

    public List<DettaglioPrezzo> getDettagliPrezzo() {
        return dettaglioPrezzo;
    }

    public void setDettagliPrezzo(List<DettaglioPrezzo> dettagliPrezzo) {
        this.dettaglioPrezzo = dettagliPrezzo;
    }

    /**
     * Get the value of foto
     *
     * @return the value of foto
     */
    public Foto getFoto() {
        return foto;
    }

    /**
     * Set the value of foto
     *
     * @param foto new value of foto
     */
    public void setFoto(Foto foto) {
        this.foto = foto;
    }

    /**
     * Get the value of marchio
     *
     * @return the value of marchio
     */
    public Marchio getMarchio() {
        return marchio;
    }

    /**
     * Set the value of marchio
     *
     * @param marchio new value of marchio
     */
    public void setMarchio(Marchio marchio) {
        this.marchio = marchio;
    }

    /**
     * Get the value of reparto
     *
     * @return the value of reparto
     */
    public Reparto getReparto() {
        return reparto;
    }

    /**
     * Set the value of reparto
     *
     * @param reparto new value of reparto
     */
    public void setReparto(Reparto reparto) {
        this.reparto = reparto;
    }

    /**
     * Get the value of descrizione
     *
     * @return the value of descrizione
     */
    public String getDescrizione() {
        return descrizione;
    }

    /**
     * Set the value of descrizione
     *
     * @param descrizione new value of descrizione
     */
    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    /**
     * Get the value of nome
     *
     * @return the value of nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * Set the value of nome
     *
     * @param nome new value of nome
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    public Long getcodiceBarre() {
        return codiceBarre;
    }

    public void setcodiceBarre(Long val) {
        this.codiceBarre = val;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codiceBarre != null ? codiceBarre.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Prodotto)) {
            return false;
        }
        Prodotto other = (Prodotto) object;
        if ((this.codiceBarre == null && other.codiceBarre != null) || (this.codiceBarre != null && !this.codiceBarre.equals(other.codiceBarre))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return codiceBarre + "#?=" + nome + "#?=" + descrizione + "#?=" + foto.getId();
    }
}
